import axios, { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios';
import { showToast } from 'vant';
import { getCache, CACHE_KEYS } from '@/utils/cache';

const service: AxiosInstance = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || '/api',
  withCredentials: false,
  timeout: 15000, // 15秒超时，更合理的设置
});

service.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // 获取存储的token
    const token = getCache(CACHE_KEYS.TOKEN);

    // 如果token存在，添加到请求头
    if (token) {
      config.headers = config.headers || {};
      config.headers['Authorization'] = `Bearer ${token}`;
      console.log('🔐 添加Token到请求头:', `Bearer ${token.substring(0, 20)}...`);
    } else {
      console.log('⚠️ 未找到Token，发送未认证请求');
    }

    // 添加其他通用请求头
    config.headers = config.headers || {};

    // 对于multipart/form-data请求，不要设置Content-Type，让浏览器自动设置boundary
    if (!config.headers['Content-Type'] || config.headers['Content-Type'] === 'application/json') {
      // 检查是否是FormData
      if (!(config.data instanceof FormData)) {
        config.headers['Content-Type'] = 'application/json';
      }
      // 如果是FormData，删除Content-Type让浏览器自动设置
      else if (config.headers['Content-Type'] === 'multipart/form-data') {
        delete config.headers['Content-Type'];
      }
    }

    config.headers['Accept'] = 'application/json';

    // 打印请求信息（开发环境）
    if (import.meta.env.DEV) {
      console.log('📤 发送请求:', {
        method: config.method?.toUpperCase(),
        url: config.url,
        baseURL: config.baseURL,
        headers: config.headers,
        params: config.params,
        data: config.data
      });
    }

    return config;
  },
  (error: AxiosError) => {
    console.error('❌ 请求拦截器错误:', error);
    return Promise.reject(error);
  },
);

service.interceptors.response.use(
  (response: AxiosResponse) => {
    const res = response.data;

    // 打印响应信息（开发环境）
    if (import.meta.env.DEV) {
      console.log('📥 收到响应:', {
        status: response.status,
        statusText: response.statusText,
        url: response.config.url,
        data: res
      });
    }

    // 检查业务状态码
    if (res.code !== 200) {
      // 处理token过期或无效
      if (res.code === 401 || res.code === 403) {
        console.warn('🔒 Token无效或已过期，清除本地token');
        // 清除本地token
        import('@/utils/cache').then(({ removeCache, CACHE_KEYS }) => {
          removeCache(CACHE_KEYS.TOKEN);
          removeCache(CACHE_KEYS.USER_INFO);
        });

        // 跳转到登录页
        if (window.location.pathname !== '/login') {
          showToast('登录已过期，请重新登录');
          setTimeout(() => {
            window.location.href = '/login';
          }, 1500);
        }
        return Promise.reject(new Error('登录已过期'));
      }

      // 其他业务错误
      const errorMsg = res.message || res.msg || 'Error';
      showToast(errorMsg);
      return Promise.reject(new Error(errorMsg));
    } else {
      // 返回完整的响应对象，保持与API服务层的兼容性
      return response;
    }
  },
  (error: AxiosError) => {
    console.error('❌ 响应拦截器错误:', error);

    // 处理网络错误
    if (error.response) {
      const { status, statusText } = error.response;
      console.error(`HTTP错误 ${status}: ${statusText}`);

      // 处理特定HTTP状态码
      switch (status) {
        case 401:
          showToast('未授权，请重新登录');
          // 清除token并跳转登录页
          import('@/utils/cache').then(({ removeCache, CACHE_KEYS }) => {
            removeCache(CACHE_KEYS.TOKEN);
            removeCache(CACHE_KEYS.USER_INFO);
          });
          if (window.location.pathname !== '/login') {
            setTimeout(() => {
              window.location.href = '/login';
            }, 1500);
          }
          break;
        case 403:
          showToast('权限不足');
          break;
        case 404:
          showToast('请求的资源不存在');
          break;
        case 500:
          showToast('服务器内部错误');
          break;
        default:
          showToast(`请求失败: ${statusText}`);
      }
    } else if (error.request) {
      console.error('网络错误:', error.request);
      showToast('网络连接失败，请检查网络');
    } else {
      console.error('请求配置错误:', error.message);
      showToast('请求配置错误');
    }

    return Promise.reject(error);
  },
);

export const http = {
  get<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {
    return service.get(url, config);
  },

  post<T = any>(url: string, data?: object, config?: AxiosRequestConfig): Promise<T> {
    return service.post(url, data, config);
  },

  put<T = any>(url: string, data?: object, config?: AxiosRequestConfig): Promise<T> {
    return service.put(url, data, config);
  },

  delete<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {
    return service.delete(url, config);
  },
};

export default service;
